package com.itbaizhan.springsecuritydemo.controller;


import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/*用户认证通过后，有时我们需要获取用户信息，比如在网站顶部显示：
欢迎您，XXX。Spring Security将用户信息保存在会话中，
并提供会话管理，我们可以从SecurityContext对象中获取用户信息，
SecurityContext对象与当前线程进行绑定。*/
//Rest开头，返回的是JSONs格式
@RestController
public class Mycontroller {
    //获取当前登录用户名
    @RequestMapping("/users/username")
    public String getUsername(){
       // 1 获取会话对象
        SecurityContext context = SecurityContextHolder.getContext();

        //2 获取认证对象   Authentication:  身份验证; 认证；鉴定;
        Authentication authentication = context.getAuthentication();

        //3 获取用户登录信息  authentication.getPrincipal()  强转为userdetails
        UserDetails userDetails =(UserDetails) authentication.getPrincipal();
        return userDetails.getUsername();
    }

    //测试用户权限
    //@Secured 权限名必须以ROLE_开头  数据库的权限url也要ROLE_ 开头
       // @Secured("ROLE_/reportform/find")
    @PreAuthorize("hasAnyAuthority('/reportform/find')")
        @GetMapping("/reportform/find")
    public String findReportForm() {
            return "查询报表";
        }

        @PreAuthorize("hasAnyAuthority('/salary/find')")
        @GetMapping("/salary/find")
        public String findSalary() {
            return "查询工资";
        }

    @PreAuthorize("hasAnyAuthority('/staff/find')")
        @GetMapping("/staff/find")
        public String findStaff() {
            return "查询员工";
        }

    @PreAuthorize("hasAnyAuthority('/tax/find')")
        @GetMapping("/tax/find")
        public String findtax() {
        return "查询税务";
    }
}
/*登录后访问：http://localhost：80/users/username*/

/*除了配置类，在SpringSecurity中提供了一些访问控制的注解。这些注解默认都是不可用的，需要开启后使用。

@Secured
该注解是基于角色的权限控制，要求UserDetails中的权限名必须以ROLE_开头。

在配置类开启注解使用

@SpringBootApplication
@MapperScan("com.itbaizhan.mysecurity.mapper")
@EnableGlobalMethodSecurity(securedEnabled=true)
public class MysecurityApplication {
  public static void main(String[] args) {
    SpringApplication.run(MysecurityApplication.class, args);
   }
}
在控制器方法上添加注解

@Secured("ROLE_reportform")
@GetMapping("/reportform/find")
public String findReportForm() {
  return "查询报表";
}

(常用)
@PreAuthorize
该注解可以在方法执行前判断用户是否具有权限

在配置类开启注解使用  与@Secured开启注解方式不同

@SpringBootApplication
@MapperScan("com.itbaizhan.mysecurity.mapper")
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MysecurityApplication {
  public static void main(String[] args) {
    SpringApplication.run(MysecurityApplication.class, args);
   }
}
在控制器方法上添加注解

@PreAuthorize("hasAnyAuthority('/reportform/find')")
@GetMapping("/reportform/find")
public String findReportForm() {
  return "查询报表";
}*/